import { LoggerComponent } from '../../components';
import { HintRollingTipInfo } from '../../declarations';

/**
 * - 作者: DoooReyn
 * - 日期: 2023.11.01
 * - 名称: HintRollingTip
 * - 描述: 滚动提示基类
 */
export class HintRollingTip extends LoggerComponent {
    /** 标记 */
    private __key: string;

    /** 获取标记 */
    get key() {
        return this.__key;
    }

    /** 设置标记 */
    set key(k: string) {
        this.__key = k;
    }

    /**
     * 显示滚动提示
     * @param cfg 滚动提示配置
     * @param skipTransition 是否跳过进入表现
     */
    public async show(cfg: HintRollingTipInfo, skipTransition: boolean = false): Promise<void> {
        this.setTip(cfg.tip);
        this.key = `${cfg.bundle}/${cfg.path}`;
        !skipTransition && (await this.onTransitionEnter());
        await this.startRolling();
    }

    /** 移除提示 */
    public async hide() {
        await this.onTransitionExit();
        this.node.destroy();
    }

    /**
     * 设置提示文本
     * @param tip 提示文本
     * @description 根据需要重写此方法
     */
    setTip(tip: string) {}

    /** 
     * 开始滚动
     * @description 子类需要调用此方法，并添加滚动逻辑
     */
    private async startRolling() {
        this.node.parent?.emit('rolling-began', this);
    }

    /** 
     * 停止滚动 
     * @description 滚动完成后请调用此方法
     */
    protected stopRolling() {
        this.node.parent?.emit('rolling-ended', this);
    }

    /** 
     * 进入表现
     * @description 根据需要重写此方法
     */
    protected async onTransitionEnter(): Promise<void> {}

    /** 
     * 退出表现
     * @description 根据需要重写此方法
     */
    protected async onTransitionExit(): Promise<void> {}
}
